/**
 * socket后台
 * 
 * 使用WS模块
 * 它可以独立成服务，也可以和express进行绑定
 * 此例程采用独立服务，独立端口
 * 
 * ws 通过事件机制来实现多并发
 * 连接事件：connection -- 当有页面发起连接请求的时候触发 - ws 对象
 * 通过 ws 对象(句柄)，由于它指向对应的客户端，就可以通过它向客户端发消息
 * 这些ws对象是存在服务器里边的，以数组元素形式存在
 */

const WebSocket = require("ws");
const _url = require("url");

const _allusers = require("./allUsers.js");

//实例化socket服务
const _ws = new WebSocket.Server({
	port: 3000,
	// 拦截设置
	verifyClient:function( info ){
		var query = _url.parse(info.req.url,true).query;
		return _allusers.match(query.name,query.password);
	}
	/* verifyClient:function( info,cb){
		// cb(是否拒绝链接，指定返回的http错误状态码,指定返回的http错误信息,可以设定附加的额外头部信息)
		
		// console.info(JSON.stringify(info.req.url));
		var query = _url.parse(info.req.url,true).query;
		console.info(query);
		if(if(_allusers.match(query.name,query.password))){
			// 此处尝试使用cb拒绝或者允许连接
			cb(true);
			// return true;
		}else{
			cb(false,403,"拒绝连接");
		}
		// return false;
	} */
}, function() {
	console.info("socket服务已经启动")
});


// 事件机制
// 新连接事件 - (ws,request) - ws:客户端连接对象(保存在服务端),request: 客户端连接请求
_ws.on("connection", function(ws, request) {
	// 客户端的消息进行处理，长连接的实务，
	// 客户端每次发送来消息，都有这个回调进行处理
	ws.onmessage = function(mess) {
		var query = _url.parse(request.url, true).query;

		ws.xxxName = query.name;
		
		var MD = JSON.parse(mess.data);  //消息的对象格式
		if(MD.type == "connect"){
			console.info(MD.sender + "  :    " + MD.info);
			var serverMessage = {
				type:"welcome",
				sender:MD.sender,
				info:"~您已经进入聊天室"
			}
			ws.send(JSON.stringify(serverMessage));
		}
		// 聊天室/公聊
		if(MD.type == "public"){
			_ws.clients.forEach(function each(ws) {
				if(!ws){
					return;
				}
				var serverMessage = {
					type:"public",
					sender:MD.sender,
					info:MD.info
				}
				ws.send(JSON.stringify(serverMessage));
			});
			
		}
		// 私聊
		if(MD.type == "private"){
			if(!MD.to){
				return;
			}
			_ws.clients.forEach(function each(ws) {
				if(!ws.xxxName){
					return;
				}
				if( MD.to == ws.xxxName ){
					var serverMessage = {
						type:"private",
						sender:MD.sender,
						info:MD.info
					}
					ws.send(JSON.stringify(serverMessage));
				}
				
			});
		}
		// 以下是我的代码
		/* console.log(query.name);
		var obj = {
			userName:query.name,
			info:mess.data
		};
		_ws.clients.forEach(function each(ws) {
			ws.send(JSON.stringify(obj));
		}); */
	}
});


// 向客户端发送信息
/* setInterval(function(){
	_ws.clients.forEach(function each(ws) {
		if(!ws.xxxName){
			return;
		}
		
		// 接收后台发送过来的参数
		// 并发送给前端
	});
},3000) */

// 广播：向所有用户发送信息
// 遍历所有客户端，依次调用它们的send函数，发送信息
/* setInterval(function(){
	_ws.clients.forEach(function each(ws) {
		// console.info(ws.xxxName);
		if(!ws.xxxName){
			return;
		}
	    // 这是广播
		if(ws.xxxName == "huang"){
			ws.send("我是服务端，正在点名");
		}
		
	});
},3000); */
